package com.example.spd.controller;

import com.example.spd.service.taobaoUrl.TaobaoUrlService;
import com.example.spd.service.taobaoUrl.TaobaoUrlServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.List;

@RestController
public class SPD2taobaoController {
    //如有疑问请参考淘宝码上放心接口文档API:https://open.taobao.com/api.htm?docId=64956&docType=2&scopeId=20981
    @Resource
    private TaobaoUrlService taobaoUrlService;


    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }

    @PostMapping("/selectDrugListUrl")
    public Object selectDrugListUrl(String code) {
        return taobaoUrlService.selectDrugListUrl(String.valueOf(code));
    }

    /**
     * 零售单据上传接口
     * bill_code  单据编号（唯一）
     * bill_time  单据时间（一般为药品入出库时间）（2024-02-02 02:21:21）
     * bill_type  单据类型[323,零售出库][322,疫苗接种][116,消费者退货入库]
     * ref_user_id  上传单据的医疗机构在码上放心平台的ref_ent_id，可通过“通过企业名得到唯一标识”接口获取
     * trace_codes  	追溯码【多个码时用逗号拼接的字符串。要求数量在3500个码以下，但一般不要传这么多，如果网络不好很容易传输一半报错】注意：在同一张单据里，不能有重复的码；在同一张单据中不能同时上传有关联关系的大、小码
     */
    @PostMapping("/uploadretail")
    public void uploadretail(String bill_code, Date bill_time, String bill_type, String trace_codes) {
        taobaoUrlService.uploadretail(bill_code, bill_time, bill_type, trace_codes);
    }

    /**
     * 零售单据上传接口
     * bill_code  单据编号（唯一）
     * bill_time  单据时间（一般为药品入出库时间）（2024-02-02 02:21:21）
     * bill_type 	单据类型：102代表采购入库、202代表退货出库、205代表销毁出库
     * physic_type 	药品类型[2,特药，3,普药]【可以随便填写，单据上传后会以实际为准】
     * from_user_id  发货企业ent_id，可通过“通过企业名得到唯一标识”接口获取；（102采购入库填药品供应商id、202退货出库填医院id、205销毁出库填医院id）
     * to_user_id  收货企业ent_id，可通过“通过企业名得到唯一标识”接口获取；（102采购入库填医院id、202退货出库填药品供应商id、205销毁出库填医院id）
     * trace_codes  	追溯码【多个码时用逗号拼接的字符串。要求数量在3500个码以下，但一般不要传这么多，如果网络不好很容易传输一半报错】注意：在同一张单据里，不能有重复的码；在同一张单据中不能同时上传有关联关系的大、小码
     * client_type  客户端类型[必须填2]
     */
    @PostMapping("/traceCodes")
    public void traceCodes(String bill_code, Date bill_time, Integer bill_type, Integer physic_type, String from_user_id, String to_user_id, String trace_codes) {
        taobaoUrlService.traceCodes(bill_code, bill_time, bill_type, physic_type, from_user_id, to_user_id, trace_codes);
    }

    /**
     * 上传单据后处理状态查询
     * ref_ent_id  企业ID
     * begin_date  开始日期（没有时分秒，【单据创建时间】）
     * end_date 	结束日期（没有时分秒，【单据创建时间】）
     * bill_type 	单据类型 A：全部 AI：全部入库 AO：全部出库
     * page_size  页大小
     * page  页码
     */
    @PostMapping("/billstatus")
    public Object billstatus(String begin_date, String end_date, String bill_type, Long page_size, Long page) {
        return taobaoUrlService.billstatus(begin_date, end_date, bill_type, page_size, page);
    }


    /**
     * 单码关联关系查询
     * ref_ent_id  企业ID
     * code  追溯码
     * des_ref_ent_id  目标企业唯一标识（为哪个企业查询，一般与入参ref_ent_id一样）
     */
    @PostMapping("/relation")
    public Object relation(String code) {
        return taobaoUrlService.relation(code);
    }

    /**
     * 通过企业名得到唯一标识ref_ent_id及企业ent_id
     * ref_ent_id  企业ID
     * code  追溯码
     * des_ref_ent_id  目标企业唯一标识（为哪个企业查询，一般与入参ref_ent_id一样）
     */
    @PostMapping("/getentinfo")
    public Object getentinfo() {
        return taobaoUrlService.getentinfo();
    }


    /**
     * 根据码查询码信息
     * ref_ent_id  企业ID
     * codes  	码列表【多个码用逗号拼接的字符串。要求数量在1000个码以下，但一般不要传这么多，如果网络不好很容易传输一半报错】
     */
    @PostMapping("/codedetail")
    public Object codedetail(@RequestBody String codes) {
        return taobaoUrlService.codedetail(codes);
    }


    @PostMapping("/upbillcode")
    public Object uploadinoutbill(@RequestBody String codes) {
        return taobaoUrlService.uploadinoutbill(codes);
    }

    @GetMapping("/selectBox")
    public Object selectBox(@RequestBody String codes) {
        Object upbillcode = taobaoUrlService.upbillcode(codes);
        String upbillcodeStr = upbillcode.toString();
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode rootNode = null;
        try {
            rootNode = objectMapper.readTree(upbillcodeStr);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
        String fromUserId = rootNode.path("alibaba_alihealth_drugtrace_top_yljg_query_upbillcode_response")
                .path("result")
                .path("model_list")
                .path("bill_upstream_d_t_o")
                .path("from_user_id")
                .asText();
        // 使用fromUserId调用第二个方法
        Object uploadinoutbill = taobaoUrlService.uploadinoutbill(fromUserId);




        return taobaoUrlService.upbillcode(codes);

    }


    /**
     * 医疗机构查询本企业上游企业出库单据信息
     * ref_ent_id  企业ID
     * begin_date  	开始日期（不写时分秒）
     * end_date     结束日期（不写时分秒）
     * page_size    页大小
     * page         页码
     */
    @PostMapping("/listupout")
    public Object listupout(String begin_date, String end_date, Long page_size, Long page) {
        return taobaoUrlService.listupout(begin_date, end_date, page_size, page);
    }

    /**
     * 医疗机构查询本企业上游企业出库单据信息
     * ref_ent_id  企业ID
     * bill_code      单据编码
     * from_ref_user_id     发货企业renEntId
     * to_ref_user_id    收货企业refEntId
     */
    @PostMapping("/detail")
    public Object detail(String bill_code, String from_ref_user_id, String to_ref_user_id) {
        return taobaoUrlService.detail(bill_code, from_ref_user_id, to_ref_user_id);
    }

    /**
     * 往来单位查询
     * ref_ent_id  企业ID
     * page_size    页大小
     * page         页码
     */
    @PostMapping("/listparts")
    public Object listparts(String page_size, String page) {
        return taobaoUrlService.listparts(page_size, page);
    }

    /**
     * 往来单位查询
     * ref_ent_id  接口调用企业的唯一标识（接口调用者）
     * dest_ref_ent_id    	准备要查询的企业唯一标识（返回该唯一标识企业的详细信息）
     */
    @PostMapping("/getbyrefentid")
    public Object getbyrefentid(String dest_ref_ent_id) {
        return taobaoUrlService.getbyrefentid(dest_ref_ent_id);
    }

    /**
     * 查询药品目录信息
     * ref_ent_id  接口调用企业的唯一标识（接口调用者）
     * physic_name    	药品通用名
     * page_size   页大小
     * page    	页码
     */
    @PostMapping("/drugtable")
    public Object drugtable(String physic_name, Long page_size, Long page) {
        return taobaoUrlService.drugtable(physic_name, page_size, page);
    }

    /**
     * 查询药品信息
     * ref_ent_id  接口调用企业的唯一标识（接口调用者）
     * physic_name    	药品通用名
     * page_size   页大小
     * page    	页码
     */
    @PostMapping("/getdruglist")
    public Object getdruglist(String physic_name, Long page_size, Long page) {
        return taobaoUrlService.getdruglist(physic_name, page_size, page);
    }

    /**
     * 查询药品信息
     * ref_ent_id  接口调用企业的唯一标识（接口调用者）
     * business   药 行业线：传 1
     * service   基础版：传 11
     */
    @PostMapping("/getenddate")
    public Object getenddate() {
        return taobaoUrlService.getenddate();
    }


    /**
     * 获取重点追溯品种明细下载URL
     * ref_ent_id  接口调用企业的唯一标识（接口调用者）
     */
    @PostMapping("/downloadurl")
    public Object downloadurl() {
        return taobaoUrlService.downloadurl();
    }

}